package com.bookshop.configuration;

import com.google.common.hash.BloomFilter;
import com.google.common.hash.Funnels;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import java.nio.charset.Charset;

@Slf4j
@Component
public class BloomFilterManager {

    private BloomFilter<String> bloomFilter;

    // 创建对象的时候初始化一次
    public BloomFilterManager(){
        log.info("BloomFilterManager初始化布隆过滤器");
        initBloomFilter();
    }

    /**
     * 初始化布隆过滤器，同时也是重置操作
     * expectedInsertions：期望添加的数据个数
     * fpp：期望的误判率，期望的误判率越低，布隆过滤器计算时间越长
     * @return
     */
    public void initBloomFilter() {
        // 这部分配置了用于将字符串转换为比特数组的Funnel（漏斗）。Funnels是Guava库中的一个工具类，
        // stringFunnel方法用于创建一个字符串类型的漏斗，Charset.forName("utf-8")指定了使用UTF-8字符集进行编码。
        this.bloomFilter = BloomFilter.create(Funnels.stringFunnel(Charset.forName("utf-8")), 10000, 0.0001);;
    }

    // 向布隆过滤器添加元素
    public void put(String element) {
        bloomFilter.put(element);
    }

    // 检查对象是否存在
    public Boolean mightContain(String element){
        return bloomFilter.mightContain(element);
    }
}
